/* * Author: Chris Seguin * * This software has been developed under the copyleft * rules of the GNU General Public License. Please * consult the GNU General Public License for more * details about use and distribution of this software. */ package org.acm.seguin.uml; import java.util.Iterator; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import org.acm.seguin.ide.common.SourceBrowser; import org.acm.seguin.ide.common.SourceBrowserAdapter; import org.acm.seguin.summary.MethodSummary; import org.acm.seguin.summary.ParameterSummary; import org.acm.seguin.summary.TypeSummary; import org.acm.seguin.uml.refactor.AddChildClassListener; import org.acm.seguin.uml.refactor.AddMoveClassListener; import org.acm.seguin.uml.refactor.AddParentClassListener; import org.acm.seguin.uml.refactor.AddRenameClassListener; import org.acm.seguin.uml.refactor.DialogViewListener; import org.acm.seguin.uml.refactor.ExtractInterfaceListener; import org.acm.seguin.uml.refactor.MoveMethodListener; import org.acm.seguin.uml.refactor.PushDownFieldListener; import org.acm.seguin.uml.refactor.PushDownMethodListener; import org.acm.seguin.uml.refactor.PushUpAbstractMethodListener; import org.acm.seguin.uml.refactor.PushUpFieldListener; import org.acm.seguin.uml.refactor.PushUpMethodListener; import org.acm.seguin.uml.refactor.RemoveClassListener; import org.acm.seguin.uml.refactor.RenameFieldListener; import org.acm.seguin.uml.refactor.RenameParameterListener; /** * UMLPopupMenu * *@author Chris Seguin */ public class UMLPopupMenu { // Instance Variables private JPopupMenu popupMenu; private JPanel activeComponent; private UMLPackage current; /** * Constructor for the UMLPopupMenu object * *@param top the package diagram *@param init the specific panel */ public UMLPopupMenu(UMLPackage top, JPanel init) { // Set the variables activeComponent = init; current = top; popupMenu = createPopupMenu(); popupMenu.setInvoker(activeComponent); } /** * Get the popup menu * *@return the popup menu */ public JPopupMenu getMenu() { return popupMenu; } /** * Add in the metrics * *@param menu Description of Parameter *@return the metrics */ protected JMenuItem getMetricsMenu(JPopupMenu menu) { // Add in metrics JMenu metrics = new JMenu("Metrics"); JMenuItem item = new JMenuItem("Project Metrics"); metrics.add(item); ProjectMetricsListener projectML = new ProjectMetricsListener(menu, item); item.addMouseListener(projectML); item.addActionListener(projectML); item = new JMenuItem("Package Metrics"); metrics.add(item); PackageMetricsListener packageML = new PackageMetricsListener(current, menu, item); item.addMouseListener(packageML); item.addActionListener(packageML); item = new JMenuItem("Class Metrics"); metrics.add(item); TypeMetricsListener tml = new TypeMetricsListener(activeComponent, menu, item); item.addMouseListener(tml); item.addActionListener(tml); if (activeComponent == null) { // Do nothing } else if (activeComponent instanceof UMLMethod) { UMLMethod umlMethod = (UMLMethod) activeComponent; item = new JMenuItem("Method Metrics"); metrics.add(item); MethodMetricsListener listener = new MethodMetricsListener(umlMethod.getSummary(), menu, item); item.addMouseListener(listener); item.addActionListener(listener); } // Return the value return metrics; } /** * Create the popup menu * *@return Description of the Returned Value */ protected JPopupMenu createPopupMenu() { JMenuItem item; JPopupMenu menu = new JPopupMenu("UML Diagram"); if (activeComponent == null) { // Do nothing } else if (activeComponent instanceof UMLField) { UMLField field = (UMLField) activeComponent; if (field.isAssociation()) { item = new JMenuItem("Convert to Attribute"); } else { item = new JMenuItem("Convert to Association"); } item.setEnabled(field.isConvertable()); menu.add(item); item.addMouseListener(new PopupMenuListener(menu, item)); item.addActionListener(new ConvertAdapter(current, field)); menu.addSeparator(); } // Add refactorings addRefactorings(menu); menu.addSeparator(); // Add metrics item = getMetricsMenu(menu); menu.add(item); // Add source link if (SourceBrowser.get().canBrowseSource()) { menu.addSeparator(); item = new JMenuItem("Show source"); SourceBrowserAdapter adapter = new SourceBrowserAdapter((ISourceful) activeComponent); item.addActionListener(adapter); menu.add(item); } // Return the menu return menu; } /** * Refactorings * *@param menu The feature to be added to the Refactorings attribute */ protected void addRefactorings(JPopupMenu menu) { addTypeRefactorings(menu); if (activeComponent == null) { // Do nothing } else if (activeComponent instanceof UMLMethod) { addMethodRefactorings(menu); } else if (activeComponent instanceof UMLField) { addFieldRefactorings(menu); } } /** * Gets the Type attribute of the UMLPopupMenu object * *@return The Type value */ private UMLType getType() { if (activeComponent instanceof UMLType) { return (UMLType) activeComponent; } else if (activeComponent instanceof UMLLine) { return ((UMLLine) activeComponent).getParentType(); } return null; } /** * Gets the Type attribute of the UMLPopupMenu object * *@return The Type value */ private TypeSummary getTypeSummary() { UMLType umlType = getType(); if (umlType == null) { return null; } return umlType.getSummary(); } /** * Adds a feature to the FieldRefactorings attribute of the UMLPopupMenu * object * *@param menu The feature to be added to the FieldRefactorings attribute */ private void addFieldRefactorings(JPopupMenu menu) { // Add in metrics JMenu fieldRefactorings = new JMenu("Field Refactorings"); menu.add(fieldRefactorings); JMenuItem item = new JMenuItem("Rename"); fieldRefactorings.add(item); item.setEnabled(true); RenameFieldListener renameListener = new RenameFieldListener(current, ((UMLField) activeComponent).getSummary(), menu, item); item.addMouseListener(renameListener); item.addActionListener(renameListener); item = new JMenuItem("Push Up"); fieldRefactorings.add(item); item.setEnabled(true); PushUpFieldListener pushUpListener = new PushUpFieldListener( current, getTypeSummary(), ((UMLField) activeComponent).getSummary(), menu, item); item.addMouseListener(pushUpListener); item.addActionListener(pushUpListener); item = new JMenuItem("Push Down"); fieldRefactorings.add(item); item.setEnabled(true); PushDownFieldListener pushDownListener = new PushDownFieldListener( current, getTypeSummary(), ((UMLField) activeComponent).getSummary(), menu, item); item.addMouseListener(pushDownListener); item.addActionListener(pushDownListener); } /** * Adds a feature to the MethodRefactorings attribute of the UMLPopupMenu * object * *@param menu The feature to be added to the MethodRefactorings attribute */ private void addMethodRefactorings(JPopupMenu menu) { MethodSummary methodSummary = ((UMLMethod) activeComponent).getSummary(); // Add in metrics JMenu methodRefactorings = new JMenu("Method Refactorings"); menu.add(methodRefactorings); JMenuItem item = new JMenuItem("Rename"); item.setEnabled(false); methodRefactorings.add(item); item.addMouseListener(new PopupMenuListener(menu, item)); item = new JMenuItem("Push Up"); methodRefactorings.add(item); item.setEnabled(true); PushUpMethodListener pushUpListener = new PushUpMethodListener( current, ((UMLMethod) activeComponent).getSummary(), menu, item); item.addMouseListener(pushUpListener); item.addActionListener(pushUpListener); item = new JMenuItem("Push Up (Abstract)"); methodRefactorings.add(item); item.setEnabled(true); PushUpAbstractMethodListener pushUpAbsListener = new PushUpAbstractMethodListener( current, ((UMLMethod) activeComponent).getSummary(), menu, item); item.addMouseListener(pushUpAbsListener); item.addActionListener(pushUpAbsListener); item = new JMenuItem("Push Down"); methodRefactorings.add(item); item.setEnabled(true); PushDownMethodListener pushDownListener = new PushDownMethodListener( current, getTypeSummary(), methodSummary, menu, item); item.addMouseListener(pushDownListener); item.addActionListener(pushDownListener); item = new JMenuItem("Move Method"); methodRefactorings.add(item); item.setEnabled(methodSummary.getParameterCount() > 0); MoveMethodListener moveListener = new MoveMethodListener( current, getTypeSummary(), methodSummary, menu, item); item.addMouseListener(moveListener); item.addActionListener(moveListener); if (methodSummary.getParameterCount() == 0) { item = new JMenuItem("Rename Parameters"); item.setEnabled(false); methodRefactorings.add(item); } else { JMenu rename = new JMenu("Rename Parameter:"); methodRefactorings.add(rename); Iterator iter = methodSummary.getParameters(); while (iter.hasNext()) { ParameterSummary next = (ParameterSummary) iter.next(); item = new JMenuItem(next.getName()); rename.add(item); RenameParameterListener rpl = new RenameParameterListener( menu, item, current, next); item.addMouseListener(rpl); item.addActionListener(rpl); } } } /** * Adds a feature to the TypeRefactorings attribute of the UMLPopupMenu * object * *@param menu The feature to be added to the TypeRefactorings attribute */ private void addTypeRefactorings(JPopupMenu menu) { TypeSummary[] typeArray = SelectedSummaryList.list(current, getType()); // Add in metrics JMenu typeRefactorings = new JMenu("Type Refactorings"); menu.add(typeRefactorings); JMenuItem item = new JMenuItem("Rename Class"); typeRefactorings.add(item); DialogViewListener rcl = new AddRenameClassListener( current, getTypeSummary(), menu, item); item.addMouseListener(rcl); item.addActionListener(rcl); // Add in moving a class item = new JMenuItem("Move Class To"); item.setEnabled(true); typeRefactorings.add(item); DialogViewListener ncl = new AddMoveClassListener( typeArray, menu, item); item.addMouseListener(ncl); item.addActionListener(ncl); // Add in a parent class item = new JMenuItem("Add Abstract Parent Class"); item.setEnabled(true); typeRefactorings.add(item); DialogViewListener aapl = new AddParentClassListener( current, typeArray, menu, item); item.addMouseListener(aapl); item.addActionListener(aapl); // Add in a child class item = new JMenuItem("Add Child Class"); typeRefactorings.add(item); item.setEnabled(true); DialogViewListener accl = new AddChildClassListener( current, getTypeSummary(), menu, item); item.addMouseListener(accl); item.addActionListener(accl); // Remove a child class item = new JMenuItem("Remove Class"); typeRefactorings.add(item); item.setEnabled(true); RemoveClassListener removeListener = new RemoveClassListener( current, getTypeSummary(), menu, item); item.addMouseListener(removeListener); item.addActionListener(removeListener); // Extract Interface item = new JMenuItem("Extract Interface"); typeRefactorings.add(item); item.setEnabled(true); DialogViewListener eil = new ExtractInterfaceListener( current, typeArray, menu, item); item.addMouseListener(eil); item.addActionListener(eil); } }